package com.tripwego.server.sercice;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;

import com.google.appengine.api.utils.SystemProperty;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.tripwego.client.service.EtapeDao;
import com.tripwego.server.jdo.EtapeJdo;
import com.tripwego.shared.dto.EtapeDto;

/**
 * @author jguibert
 * 
 *         CRUD EtapeDao
 */
public class JdoEtapeDao extends RemoteServiceServlet implements EtapeDao {
	private static final Logger log = Logger.getLogger(JdoEtapeDao.class
			.getName());

	private static final long serialVersionUID = 1L;

	private static final boolean PRODUCTION_MODE = SystemProperty.environment
			.value() == SystemProperty.Environment.Value.Production;

	private PersistenceManager pm = PMF.get().getPersistenceManager();

	Transaction tx;

	@Override
	public Long create(EtapeDto etapeDto) {
		log.info("-create()-DEB");

		EtapeJdo entity = new EtapeJdo();
		entity.setTripId(etapeDto.getTripId());
		entity.setAddress(etapeDto.getAddress());
		entity.setDateDeb(etapeDto.getDateDeb());
		entity.setDateFin(etapeDto.getDateFin());
		entity.setFirstStep(etapeDto.isFirstStep());
		entity.setIconUrl(etapeDto.getIconUrl());
		entity.setLatitude(etapeDto.getLatitude());
		entity.setLongitude(etapeDto.getLongitude());
		entity.setName(etapeDto.getName());
		entity.setOrder(etapeDto.getOrder());
		entity.setTravelMode(etapeDto.getTravelMode());

		entity.setDateCreation(new Date());
		entity.setDateModification(new Date());

		tx = pm.currentTransaction();
		tx.begin();

		pm.makePersistent(entity);

		tx.commit();

		log.info("-create()-FIN");

		return entity.getId();
	}

	@Override
	public void update(EtapeDto etapeDto) {
		log.info("-update()-DEB");

		EtapeJdo entity = (EtapeJdo) pm.getObjectById(EtapeJdo.class,
				etapeDto.getId());

//		entity.setAddress(etapeDto.getAddress());
		entity.setDateDeb(etapeDto.getDateDeb());
		entity.setDateFin(etapeDto.getDateFin());
//		entity.setFirstStep(etapeDto.isFirstStep());
//		entity.setIconUrl(etapeDto.getIconUrl());
//		entity.setLatitude(etapeDto.getLatitude());
//		entity.setLongitude(etapeDto.getLongitude());
		entity.setName(etapeDto.getName());
//		entity.setOrder(etapeDto.getOrder());
//		entity.setTravelMode(etapeDto.getTravelMode());

		entity.setDateModification(new Date());

		tx = pm.currentTransaction();
		tx.begin();

		pm.makePersistent(entity);

		tx.commit();

		log.info("-update()-FIN");
	}

	@Override
	public void delete(EtapeDto etapeDto) {
		log.info("-delete()-DEB");

		tx = pm.currentTransaction();
		tx.begin();

		EtapeJdo entity = (EtapeJdo) pm.getObjectById(EtapeJdo.class,
				etapeDto.getId());
		pm.deletePersistent(entity);

		tx.commit();

		log.info("-delete()-FIN");
	}

	@Override
	public List<EtapeDto> findByTripId(Long tripId) {
		log.info("findByTripId - DEB");

		List<EtapeDto> liste = new ArrayList<EtapeDto>();

		Query query = pm.newQuery(EtapeJdo.class, "tripId == " + tripId);
		query.setOrdering("order");

		try {
			List<EtapeJdo> results = (List<EtapeJdo>) query.execute();
			if (results.iterator().hasNext()) {
				for (EtapeJdo entity : results) {

					EtapeDto etapeDto = new EtapeDto();

					etapeDto.setAddress(entity.getAddress());
					etapeDto.setDateDeb(entity.getDateDeb());
					etapeDto.setDateFin(entity.getDateFin());
					etapeDto.setFirstStep(entity.isFirstStep());
					etapeDto.setIconUrl(entity.getIconUrl());
					etapeDto.setId(entity.getId());
					etapeDto.setLatitude(entity.getLatitude());
					etapeDto.setLongitude(entity.getLongitude());
					etapeDto.setName(entity.getName());
					etapeDto.setOrder(entity.getOrder());
					etapeDto.setTravelMode(entity.getTravelMode());
					etapeDto.setTripId(entity.getTripId());

					liste.add(etapeDto);
				}
			} else {
				log.info("findByTripId() - No results");
			}
		} finally {
			query.closeAll();
		}

		log.info("findByTripId - FIN");

		return liste;
	}
}
